/*
 * 教材中的示例程序之完整版.
 * 书名：《编译原理基础》
 * 版次：第三版
 * 作者：王献青，张立勇，张淑平，刘坚
 * 出版社：西安电子科技大学出版社
 * 程序完成时间：2025.03
 */

//
// 文件内容：示例程序的公用头文件
//

#ifndef CHAP02_LEXER_H
#define CHAP02_LEXER_H

//
// 第1部分声明： 词法分析器向外提供的API
//

// 声明全体记号类别(教材程序清单2.2)
typedef enum TokenKind {
    EOFS  , /* 输入结束(EOF), 但此处不用EOF，它与系统头文件中的符号重名了 */
    ERROR , /* 发现一个词法错误 */
    ID, INT, REAL, LT, LE, GT, GE, NE, EQ, NOT, ASSIGN
} TokenKind;

extern const char * lookup_kindname(TokenKind kind);

extern void  set_lexer_style(int style);
extern void  set_lexer_input(const char * input);
extern TokenKind  nextToken();

extern const char * get_word_begin();
extern int  get_word_length();

//
// 第2部分声明： 仅供词法分析器内部使用的API
//

#define BUFFER_SIZE  2048
extern char buffer[];         // 输入缓冲区(见教材2.5.1节)
extern char * lexeme_begin;   // 指向单词的第一个字符
extern char * forward;        // 指向当前字符，用于向前扫描

#define MY_EOF_       '\0'     //表示输入结束的特殊符号的实现
#define IS_EOF(c)     ((c)==MY_EOF_)
#define IS_LETTER(c)  (('A'<=(c) && (c)<='Z') || ('a'<=(c) && (c)<='z') || (c)=='_')
#define IS_DIGIT(c)   ('0'<=(c) && (c)<='9')

#endif //CHAP02_LEXER_H
